﻿using System;
using System.Collections.Generic;
using System.Text;
using YookingBizWQW.Class.Public;
using YookingFileIO.Class;
using YookingInterfaceFuiou.Class.FyPay;

namespace YookingBizWQW.Class.Fuiou
{
    public class clsFyPay
    {
        //注释：王庆文 2020年06月09日=========================================================================
        //商户向富友前置系统进行统一下单,信息通过http或https形式post请求递交给前置系统，编码必须为UTF-8
        //订单类型strOrderType：
        //        ALIPAY、
        //        WECHAT、
        //        WXXS(微信线上)、
        //        WXBX(微信保险类)、
        //        ALBX(支付宝保险类)
        public string Fuiou_PreCreate(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strMerchantID = "00000"; //商户号
            string strOrderType = "ALIPAY"; //订单类型
            string strAmount = "0";         //交易金额
            string strOrderID = "00000000"; //订单号码
            string strGoodsDes = "aaaaaaa"; //商品或支付单简要描述

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 5)
            {
                strMerchantID = strArray[0];
                strOrderType = strArray[1];
                strAmount = strArray[2];
                strOrderID = strArray[3];
                strGoodsDes = strArray[4];
            }

            #endregion

            clsOrderCreate myFy = new clsOrderCreate(); //商户向富友前置系统进行统一下单
            strRtData = myFy.preCreate(strMerchantID, strOrderType, strAmount, strOrderID, strGoodsDes);

            //clsRWFile myLog = new clsRWFile(); //将富友支付返回的结果记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "Fuiou_PreCreate.txt", strRtData);

            return strRtData; //富友支付反馈的结果
        }

        //注释：王庆文 2020年06月09日=========================================================================
        //商户调用此接口则用户可使用支付宝或微信进行支付。
        //本接口支持：微信公众号、微信小程序、微信APP，支付宝服务窗等。
        //信息通过http或https形式post请求递交给前置系统，编码必须为UTF-8
        //交易类型strTradeType：
        //        JSAPI--公众号支付(GZXS--公众号线上)、
        //        APP--app支付、
        //        FWC-- 支付宝服务窗、
        //        LETPAY-小程序(LPXS--小程序线上)、
        //        WXBXJS(微信公众号保险类)、
        //        WXBXLET(微信小程序保险类)、
        //        WXBXAPP(微信APP保险类)、
        //        ALBXJS(支付宝服务窗保险类)
        public string Fuiou_WxPreCreate(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strMerchantID = "0000"; //商户号
            string strTradeType = "JSAPI"; //交易类型
            string strAmount = "0";        //交易金额
            string strOrderID = "0000000"; //订单号码
            string strGoodsDes = "aaaaaa"; //商品或支付单简要描述
            string strAppID = "000000000"; //前端应用的APPID
            string strWxClientCode = "00"; //微信用户的客户端授权code 
            string strBuyerID = "0000000"; //支付宝服务窗为用户buyer_id

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 8)
            {
                strMerchantID = strArray[0];
                strTradeType = strArray[1];
                strAmount = strArray[2];
                strOrderID = strArray[3];
                strGoodsDes = strArray[4];
                strAppID = strArray[5];
                strWxClientCode = strArray[6];
                strBuyerID = strArray[7];
            }

            #endregion

            clsOrderCreate myFy = new clsOrderCreate(); //商户调用此接口则用户可使用支付宝或微信进行支付
            strRtData = myFy.wxPreCreate(strMerchantID, strTradeType, strAmount, strOrderID, strGoodsDes, strAppID, strWxClientCode, strBuyerID);

            //clsRWFile myLog = new clsRWFile(); //将富友支付返回的结果记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "Fuiou_WxPreCreate.txt", strRtData);

            return strRtData; //富友支付反馈的结果
        }

        //注释：王庆文 2020年06月09日============================================================================
        //用于订单明细查询，信息通过http或https形式post请求递交给前置系统，编码必须为UTF-8
        //订单类型strOrderType：
        //        ALIPAY (统一下单、条码支付、服务窗支付)、
        //        WECHAT(统一下单、条码支付，公众号支付)、
        //        UNIONPAY、
        //        WXAPP(微信app)、
        //        ALIAPP(支付宝app)、
        //        WXH5(微信h5)、
        //        ALIH5(支付宝h5)、
        //        WXBX(微信保险类)、
        //        ALBX(支付宝保险类)、
        //        WXXS(微信线上所有交易)
        public string Fuiou_CommonQuery(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strMerchantID = "00000"; //商户号
            string strOrderType = "ALIPAY"; //订单类型
            string strOrderID = "00000000"; //订单号码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strMerchantID = strArray[0];
                strOrderType = strArray[1];
                strOrderID = strArray[2];
            }

            #endregion

            clsOrderQuery myFy = new clsOrderQuery(); //用于富友支付订单明细查询
            strRtData = myFy.commonQuery(strMerchantID, strOrderType, strOrderID);

            //clsRWFile myLog = new clsRWFile(); //将富友支付查询结果记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "Fuiou_CommonQuery.txt", strRtData);

            return strRtData; //富友支付查询的结果
        }

        //注释：王庆文 2022年10月28日=========================================================================
        //退款接口只是一个申请接口向微信、银行等申请退款，钱会在三个工作日内到账，
        //如果这中间失败了目前不能查询，后期会增加一个退款查询接口，当交易发生之后一段时间内，
        //由于买家或者卖家的原因需要退款时，卖家可以通过退款接口将支付款退还给买家，
        //扫码支付平台将在收到退款请求并且验证成功之后，按照退款规则将支付款按原路退到买家帐号上。
        //总退款金额不能超过订单总金额。
        //注：目前支持对90天以内的交易进行退款 ，支持全额或者是多次部分退款
        //order_type 订单类型：
        //ALIPAY    (统一下单、条码支付、服务窗支付)
        //WECHAT    (统一下单、条码支付，公众号支付)
        //UNIONPAY
        //WXAPP     (微信app)
        //ALIAPP    (支付宝app)
        //WXH5      (微信h5)
        //ALIH5     (支付宝h5)
        //WXBX      (微信保险类)
        //ALBX      (支付宝保险类)
        //WXXS      (微信线上所有交易)
        public string Fuiou_CommonRefund(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strOrderType= "WXXS";    //订单类型
            string strMerchantID = "0000";  //商户号
            string strOrderID = "0000001";  //商户订单号
            string strRefundID = "0000002"; //退款单号
            string strTotalAmount = "0";    //订单总金额
            string strRefundAmount = "0";   //退款金额

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 6)
            {
                strOrderType = strArray[0];
                strMerchantID = strArray[1];
                strOrderID = strArray[2];
                strRefundID = strArray[3];
                strTotalAmount = strArray[4];
                strRefundAmount = strArray[5];
            }

            #endregion

            clsOrderRefund myFy = new clsOrderRefund(); //商户调用此接口则用户可使用支付宝或微信进行退款申请
            strRtData = myFy.CommonRefund(strOrderType, strMerchantID, strOrderID, strRefundID, strTotalAmount, strRefundAmount);

            //clsRWFile myLog = new clsRWFile(); //将富友退款请求返回的结果记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "YookingBizWQW_Fuiou_CommonRefund.txt", strRtData);

            return strRtData; //富友退款请求反馈的结果
        }

        //注释：王庆文 2022年10月28日======================================================
        //查询退款请求的交易状态，响应代码 result_code，000000成功
        //交易状态：
        //  SUCCESS      退款成功
        //  PAYERROR     退款失败
        //  USERPAYING   退款已受理(超时或状态未知，等T+1富友处理)
        public string Fuiou_RefundQuery(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strMerchantID = "0000"; //商户号
            string strRefundID = "000000"; //退款单号

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 2)
            {
                strMerchantID = strArray[0];
                strRefundID = strArray[1];
            }

            #endregion

            //查询退款请求的交易状态，响应代码 result_code，000000成功
            clsOrderRefund myFy = new clsOrderRefund();
            strRtData = myFy.RefundQuery(strMerchantID, strRefundID);

            //clsRWFile myLog = new clsRWFile(); //将富友退款查询返回的结果记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "YookingBizWQW_Fuiou_RefundQuery.txt", strRtData);

            return strRtData; //富友退款结果查询反馈的结果
        }


    }
}
